'use strict';
/**
 * 地址相关接口
 */
var vk; // 全局vk实例
// 涉及的表名
const dbName = require("../../dao/config.js");

var db = uniCloud.database(); // 全局数据库引用
var _ = db.command; // 数据库操作符
var $ = _.aggregate; // 聚合查询操作符
/**
 * 权限注意：
 * pub_ 开头的函数不需要登录即可访问 如：pub_getList
 * kh_ 开头的函数需要登录才能访问 如：kh_getList
 * sys_ 开头的函数需要授权指定权限才能访问 如：sys_getList
 * _ 开头的函数禁止前端访问 如：_before
 * 其他函数 默认均需要登录才能访问 如：getList（若将云对象文件放在pub目录下，则默认其他函数不需要登录即可访问，若放在sys目录下，则默认其他函数需要授权才能访问）
 */
var cloudObject = {
	isCloudObject: true, // 标记为云对象模式
	/**
	 * 请求前处理，主要用于调用方法之前进行预处理，一般用于拦截器、统一的身份验证、参数校验、定义全局对象等。
	 */
	_before: async function() {
		vk = this.vk; // 将vk定义为全局对象
	},
	/**
	 * 请求后处理，主要用于处理本次调用方法的返回结果或者抛出的错误
	 */
	_after: async function(obj) {
		let { err, res } = obj;
		if (err) {
			return; // 如果方法抛出错误，直接return;不处理
		}
		return res;
	},
	/**
	 * 测试并发请求时参数是否会混乱（结果：不会混乱）
	 * @url client/address.test 前端调用的url参数地址
	 */
	test: async function(data) {
		await vk.pubfn.sleep(Math.floor(Math.random() * 10) * 100);
		let { uid, userInfo: userInfo3, filterResponse, originalParam } = this.getClientInfo(); // 获取客户端信息
		let { customUtil, uniID, config, pubFun, db, _ } = this.getUtil(); // 获取工具包
		let userInfo = await this.getUserInfo(); // 获取当前登录的用户信息
		let userInfo2 = await this.getUserInfo();
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		// 业务逻辑结束-----------------------------------------------------------
		return {
			code: 0,
			data,
			userInfo,
			userInfo2,
			userInfo3,
			dbName,
		};
	},
	/**
	 * 查询多条记录 分页
	 * @url client/address.getList 前端调用的url参数地址
	 */
	getList: async function(data) {
		let { uid } = this.getClientInfo();
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		res = await vk.baseDao.getTableData({
			dbName: dbName.address,
			data,
			whereJson: {
				user_id: uid, // 只能查看自己的地址
			}
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取一条记录
	 * @url client/address.getInfo 前端调用的url参数地址
	 */
	getInfo: async function(data) {
		let res = { code: 0, msg: "" };
		// 业务逻辑开始-----------------------------------------------------------
		let { uid } = this.getClientInfo();
		let {
			_id
		} = data;
		res.info = await vk.baseDao.findByWhereJson({
			dbName: dbName.address,
			whereJson: {
				user_id: uid,
				_id
			}
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 添加和修改
	 * @url client/address.addUpdate 前端调用的url参数地址
	 */
	addUpdate: async function(data) {
		let { uid } = this.getClientInfo();
		let res = { code: 0, msg: "" };
		// 业务逻辑开始-----------------------------------------------------------

		let {
			_id,
			name,
			alias,
			mobile,
			is_default,
			mobile_area_code = "86",
			position
		} = data;

		// 参数非空检测
		let nullKey = vk.pubfn.isNullOneByObject({ name, mobile, position });
		if (nullKey) return { code: -1, msg: '参数 ' + nullKey + ' 不能为空' };

		if (vk.pubfn.isNull(position.area)) return { code: -1, msg: "请选择所在地区" };
		if (vk.pubfn.isNull(position.area.code)) return { code: -1, msg: "请选择所在地区" };
		if (vk.pubfn.isNull(position.address)) return { code: -1, msg: "请输入详情地址" };

		let provinceName = position.province.name || ""; // 省级名称
		let cityName = position.city.name || ""; // 地级市名称
		let areaName = position.area.name || ""; // 县级市名称
		let address = position.address || ""; // 街道地址

		let formatted_address = provinceName !== cityName ? provinceName + cityName + areaName + address : cityName + areaName + address;

		let dataJson = {
			name,
			alias,
			mobile,
			mobile_area_code,
			is_default,
			formatted_address,
			position,
		};

		if (position.longitude) {
			// 添加地理位置定位
			dataJson.location = new db.Geo.Point(position.longitude, position.latitude);
		}


		if (vk.pubfn.isNull(_id)) {
			// 添加
			// 添加额外字段
			dataJson = vk.pubfn.objectAssign(dataJson, {
				user_id: uid
			});
			_id = await vk.baseDao.add({
				dbName: dbName.address,
				dataJson
			});
			// 返回添加后的数据
			res.info = await vk.baseDao.findById({
				dbName: dbName.address,
				id: _id,
			});
			res.msg = "添加成功";
		} else {
			// 修改并返回修改后的数据
			res.info = await vk.baseDao.updateAndReturn({
				dbName: dbName.address,
				whereJson: {
					user_id: uid,
					_id
				},
				dataJson
			});
			res.msg = "修改成功";
		}

		if (is_default) {
			// 将其他的地址设为非默认
			await vk.baseDao.update({
				dbName: dbName.address,
				whereJson: {
					user_id: uid,
					_id: _.neq(_id),
					is_default: true,
				},
				dataJson: {
					is_default: false
				}
			});
		}
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 删除
	 * @url client/address.delete 前端调用的url参数地址
	 */
	delete: async function(data) {
		let { uid } = this.getClientInfo();
		let res = { code: 0, msg: 'ok' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id
		} = data;
		if (vk.pubfn.isNull(_id)) {
			return { code: -1, msg: 'id不能为空' };
		}
		res.num = await vk.baseDao.del({
			dbName: dbName.address,
			whereJson: {
				user_id: uid, // 只能删除自己的地址
				_id
			}
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 设置默认收货地址
	 * @url client/address.setDefault 前端调用的url参数地址
	 */
	setDefault: async function(data) {
		let { uid } = this.getClientInfo();
		let res = { code: 0, msg: "" };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id
		} = data;

		if (vk.pubfn.isNull(_id)) {
			return { code: -1, msg: 'id不能为空' };
		}
		// 去除其他地址的默认
		await vk.baseDao.update({
			dbName: dbName.address,
			whereJson: {
				user_id: uid,
			},
			dataJson: {
				is_default: false
			}
		});
		// 设置当前地址为默认地址
		await vk.baseDao.update({
			dbName: dbName.address,
			whereJson: {
				user_id: uid,
				_id,
			},
			dataJson: {
				is_default: true
			}
		});

		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取我的默认收货地址
	 * @url client/address.getDefault 前端调用的url参数地址
	 */
	getDefault: async function(data) {
		let { uid } = this.getClientInfo();
		let res = { code: 0, msg: "" };
		// 业务逻辑开始-----------------------------------------------------------
		res.info = await vk.baseDao.findByWhereJson({
			dbName: dbName.address,
			whereJson:{
				user_id: uid,
				is_default: true
			}
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	}
};

module.exports = cloudObject;
